home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / qlib205.zip / QLIB.ZIP / SRC / QLIB / STRING.ASM < prev    next >
Assembly Source File  |  1997-07-09  |  14KB  |  878 lines

  1. include qlib.inc  ;setup
  2. include dos.inc
  3. include string.inc
  4. include alloc.inc
  5. include stdio.inc
  6. include conio.inc
  7. include key.inc
  8.  
  9. .data?
  10.   ;used by sscanf & str2num
  11.   _str2num_siz_ dd ?      ;this is how many letters str2num_* used from src
  12.   tss db ?
  13.   ts db 34 dup (?)
  14. align 4
  15.   h db ?  ;('a' or 'A') - 10
  16.   tok dd ?     ;token pos (see strtok())
  17.   tokend dd ?  ;token end
  18.  
  19. .code
  20. _num2str_:
  21.   ;eax = # to decode
  22.   ;ebx = radix
  23.   mov edi,offset ts+33
  24.   mov byte ptr[edi],0
  25.   dec edi
  26.   mov ecx,32  ;the MAX
  27. num2str_2:
  28.   xor edx,edx
  29.   div ebx
  30.   .if dl<10
  31.     add dl,'0'
  32.   .else
  33.     add dl,h
  34.   .endif
  35.   mov [edi],dl
  36.   dec edi
  37.   dec ecx
  38.   jnz num2str_2
  39.   .while edi!=offset ts
  40.     mov bptr[edi],'0'
  41.     dec edi
  42.   .endw
  43.   mov bptr[edi],'0'
  44.   ret
  45.  
  46. copyit:
  47. ; esi => edi
  48. ;copies a string (and removes unneeded 0s)
  49.   mov ebx,edi
  50.   mov al,bptr[esi]
  51.   .if (al=='-')
  52.     movsb
  53.     mov al,bptr[esi]
  54.   .endif
  55.   .if (al=='0')
  56.     .while al=='0'
  57.       lodsb
  58.     .endw
  59.     stosb
  60.   .endif
  61.   .if !al  ;the # is zero
  62.     mov edi,ebx
  63.     mov bptr[edi],'0'
  64.     mov bptr[edi+1],0
  65.     ret
  66.   .endif
  67.   .while al
  68.     lodsb   ;can't use movsb : must get al loaded
  69.     stosb
  70.   .endw
  71.   ret
  72.  
  73. num2str proc,a:dword,off:dword,rax:byte
  74.   mov h,'a'-10
  75. jumpin1::
  76.   pushad
  77.   xor ebx,ebx
  78.   mov bl,rax
  79.   .if (bl>36) || (bl<2)  ;tolerance
  80.     mov ebx,off
  81.     mov bptr[ebx],0
  82.     popad
  83.     mov eax,off
  84.     ret
  85.   .endif
  86.   mov eax,a
  87.   call _num2str_
  88.   mov edi,off
  89.   mov esi,offset ts
  90.   call copyit
  91.  
  92.   popad
  93.   mov eax,off
  94.   ret
  95. num2str endp
  96.  
  97. num2strc proc,a:dword,off:dword,rax:byte
  98.   ;same as num2str except starts with capital letters when # > 9
  99.   mov h,'A'-10
  100.   jmp jumpin1
  101. num2strc endp
  102.  
  103. ;signed output (does not put in '+' symbol when pos)
  104. num2strs proc,a:dword,off:dword,rax:byte
  105.   mov h,'a'-10
  106. jumpin2::
  107.   pushad
  108.   xor ebx,ebx
  109.   mov bl,rax
  110.   .if (bl>36) || (bl<2)  ;tolerance
  111.     mov ebx,off
  112.     mov bptr[ebx],0
  113.     popad
  114.     mov eax,off
  115.     ret
  116.   .endif
  117.   mov eax,a
  118.   .if eax & 80000000h
  119.     neg eax
  120.     mov tss,'-'
  121.   .else
  122.     mov tss,0
  123.   .endif
  124. @@:
  125.   call _num2str_
  126.   mov edi,off
  127.   mov esi,offset ts
  128.   .if tss
  129.     dec esi
  130.   .endif    
  131.   call copyit
  132.   popad
  133.   mov eax,off
  134.   ret
  135. num2strs endp
  136.  
  137. num2strsc proc,a:dword,off:dword,rax:byte
  138.   ;same as num2str except starts with capital letters when # > 9
  139.   mov h,'A'-10
  140.   jmp jumpin2
  141. num2strsc endp
  142.  
  143. strcpy proc,s1off:dword,s2off:dword
  144.   ;s1=s2
  145.   pushad
  146.   mov edi,s1off
  147.   mov esi,s2off
  148.   callp strlen,esi
  149.   mov ecx,eax
  150.   inc ecx
  151.   rep movsb
  152.   popad
  153.   mov eax,s1off
  154.   ret
  155. strcpy endp
  156.  
  157. strcat proc,s1off:dword,s2off:dword
  158.   ;s1=s1+s2
  159.   pushad
  160.   mov edi,s1off
  161.   mov esi,s2off
  162.   callp strlen,esi
  163.   mov ecx,eax
  164.   inc ecx ;include NULL
  165.   callp strlen,edi
  166.   add edi,eax
  167.   rep movsb
  168.   popad
  169.   mov eax,s1off
  170.   ret
  171. strcat endp
  172.  
  173. strlen proc uses edi ecx,off:dword
  174.   mov edi,off
  175.   or ecx,-1  ;faster than mov ecx,-1 (2 bytes shorter)
  176.   xor al,al
  177.   repnz scasb
  178.   not ecx
  179.   dec ecx
  180.   mov eax,ecx
  181.   ret
  182. strlen endp
  183.  
  184. strcmp proc,p1:dword,p2:dword
  185.   pushad
  186.   mov esi,p1
  187.   mov edi,p2
  188. @@:
  189.   cmpsb
  190.   ja above
  191.   jb below
  192.   cmp byte ptr[esi-1],0
  193.   jnz @b
  194.   popad
  195.   xor eax,eax
  196.   ret
  197. above:
  198.   popad
  199.   mov eax,1   ;p1 > p2
  200.   ret
  201. below:
  202.   popad
  203.   or eax,-1    ;p1 < p2
  204.   ret
  205. strcmp endp
  206.  
  207. ;this is atol!!
  208. str2num proc,s:dword
  209.   local _neg:byte
  210.   pushad
  211.   mov esi,s
  212.   dec esi
  213. @@:
  214.   inc esi
  215.   cmp bptr[esi],0
  216.   jz bad
  217.   cmp bptr[esi],'+'
  218.   jz start
  219.   cmp bptr[esi],'-'
  220.   jz start
  221.   cmp bptr[esi],'0'
  222.   jb @b
  223.   cmp bptr[esi],'9'
  224.   ja @b
  225.   jmp start
  226. bad:
  227.   popad
  228.   mov _str2num_siz_,0
  229.   xor eax,eax
  230.   ret
  231. start:
  232.   mov _neg,0
  233.   .if bptr[esi]=='-'
  234.     inc _neg
  235.     inc esi
  236.   .elseif bptr[esi]=='+'
  237.     inc esi ;ignore it
  238.   .endif
  239.   xor ebx,ebx
  240.   mov edi,esi
  241.   dec edi
  242. @@:
  243.   cmp bptr[esi],0
  244.   jz cont
  245.   cmp bptr[esi],'0'
  246.   jb cont
  247.   cmp bptr[esi],'9'
  248.   ja cont
  249.   inc esi
  250.   inc bl
  251.   jmp @b
  252. cont:
  253.   cmp bl,10
  254.   ja bad ;to many digits!
  255.   cmp bl,0
  256.   jz bad ;no digits (could happen eg: + w/o any #s )
  257.   dec esi
  258.   mov _str2num_siz_,esi
  259.   mov eax,s
  260.   sub _str2num_siz_,eax
  261.   inc _str2num_siz_  ;total size!
  262.   ;go till esi=edi
  263.   mov ebx,1
  264.   xor ecx,ecx  ;total
  265. @@:
  266.   xor eax,eax
  267.   mov al,[esi]
  268.   sub al,'0'
  269.   mul ebx
  270.   add ecx,eax
  271.   mov eax,10
  272.   mul ebx
  273.   mov ebx,eax
  274.   dec esi
  275.   cmp esi,edi
  276.   jnz @b
  277. done:
  278.   mov eax,ecx
  279.   .if _neg
  280.     neg eax
  281.   .endif
  282.   mov [esp+7*4],eax
  283.   popad
  284.   ret
  285. str2num endp
  286.  
  287. ;this is atoh???  Hex version
  288. str2numx proc,s:dword
  289.   pushad
  290.   mov esi,s
  291. @@:
  292.   mov ax,[esi]
  293.   cmp al,0
  294.   jz bad
  295.   .if ax=='x0' || ax=='X0'   ;these are 0x and 0X
  296.     add esi,2
  297.     jmp @b
  298.   .endif
  299.   .if (al>='0') && (al<='9')
  300.     jmp start
  301.   .endif
  302.   .if (al>='A') && (al<='F')
  303.     jmp start
  304.   .endif
  305.   .if (al>='a') && (al<='f')
  306.     jmp start
  307.   .endif
  308.   inc esi
  309.   jmp @b
  310. bad:
  311.   popad
  312.   mov _str2num_siz_,0
  313.   xor eax,eax
  314.   ret
  315. start:
  316.   xor bl,bl
  317.   mov edi,esi
  318.   dec edi
  319. @@:
  320.   cmp bl,8
  321.   ja bad     ;to many digits!
  322.   mov al,[esi]
  323.   cmp bptr[esi],0
  324.   jz cont
  325.   .if (al>='A') && (al<='F')
  326.     inc bl
  327.     inc esi
  328.     jmp @b
  329.   .endif
  330.   .if (al>='a') && (al<='f')
  331.     inc bl
  332.     inc esi
  333.     jmp @b
  334.   .endif
  335.   .if (al>='0') && (al<='9')
  336.     inc bl
  337.     inc esi
  338.     jmp @b
  339.   .endif
  340. cont:
  341.   cmp bl,0
  342.   jz bad     ;no digits
  343.   mov _str2num_siz_,esi      ; # chars used (including white chars)
  344.   mov eax,s
  345.   sub _str2num_siz_,eax
  346.   dec esi
  347. ;go till esi=edi
  348.   xor cl,cl    ;shift #
  349.   xor edx,edx  ;total
  350. @@:
  351.   xor eax,eax
  352.   mov al,[esi]
  353.   .if (al>='A') && (al<='F')
  354.     add al,'a'-'A'
  355.   .endif
  356.   .if (al>='0') && (al<='9')
  357.     sub al,'0'
  358.   .endif
  359.   .if (al>='a') && (al<='f')
  360.     sub al,'a'-10              ;FIX v2.05 Beta #1 : was 'a'+10
  361.   .endif
  362.   shl eax,cl
  363.   add edx,eax
  364.   add cl,4
  365.   dec esi
  366.   cmp esi,edi
  367.   jnz @b
  368. done:
  369.   mov [esp+7*4],edx  ;save EAX for ret
  370.   popad
  371.   ret
  372. str2numx endp
  373.  
  374. ;binary version
  375. str2numb proc,s:dword
  376.   pushad
  377.   mov esi,s
  378. @@:
  379.   mov al,bptr[esi]
  380.   cmp bptr[esi],0
  381.   jz bad
  382.   .if al=='0' || al=='1'
  383.     jmp start
  384.   .endif
  385.   inc esi
  386.   jmp @b
  387. bad:
  388.   popad
  389.   mov _str2num_siz_,0
  390.   xor eax,eax
  391.   ret
  392. start:
  393.   xor ebx,ebx
  394.   mov edi,esi
  395.   dec edi ;go till here
  396. @@:
  397.   cmp bl,32
  398.   ja bad ;to many digits!
  399.   cmp bptr[esi],0
  400.   jz cont
  401.   cmp bptr[esi],'0'
  402.   jb cont
  403.   cmp bptr[esi],'1'
  404.   ja cont
  405.   inc esi
  406.   inc bl
  407.   jmp @b
  408. cont:
  409.   cmp bl,0
  410.   jz bad ;no digits
  411.   mov _str2num_siz_,esi
  412.   mov eax,s
  413.   sub _str2num_siz_,eax
  414.   dec esi
  415.  ;go till esi=edi
  416.   mov ebx,1
  417.   xor ecx,ecx  ;total
  418. @@:
  419.   xor eax,eax
  420.   mov al,[esi]
  421.   sub al,'0'
  422.   mul ebx
  423.   add ecx,eax
  424.   mov eax,2
  425.   mul ebx
  426.   mov ebx,eax
  427.   dec esi
  428.   cmp esi,edi
  429.   jnz @b
  430. done:
  431.   mov [esp+7*4],ecx  ;save eax
  432.   popad
  433.   ret
  434. str2numb endp
  435.  
  436. ;this is atoo???  Octal version
  437. str2numo proc,s:dword
  438.   pushad
  439.   mov esi,s
  440. @@:
  441.   mov al,bptr[esi]
  442.   cmp al,0
  443.   jz bad
  444.   .if (al>='0') && (al<='7')
  445.     jmp start
  446.   .endif
  447.   inc esi
  448.   jmp @b
  449. bad:
  450.   popad
  451.   mov _str2num_siz_,0
  452.   xor eax,eax
  453.   ret
  454. start:
  455.   xor bl,bl
  456.   mov edi,esi
  457.   dec edi
  458. @@:
  459.   cmp bl,8
  460.   ja bad     ;to many digits!
  461.   mov al,[esi]
  462.   cmp bptr[esi],0
  463.   jz cont
  464.   .if (al>='0') && (al<='7')
  465.     inc bl
  466.     inc esi
  467.     jmp @b
  468.   .endif
  469. cont:
  470.   cmp bl,0
  471.   jz bad     ;no digits
  472.   dec esi
  473.   mov _str2num_siz_,esi
  474.   mov eax,s
  475.   sub _str2num_siz_,eax
  476.   inc _str2num_siz_
  477.   ;go till esi=edi
  478.   mov ebx,1
  479.   xor ecx,ecx  ;total
  480. @@:
  481.   xor eax,eax
  482.   mov al,[esi]
  483.   .if (al>='0') && (al<='7')
  484.     sub al,'0'
  485.   .endif
  486.   mul ebx
  487.   add ecx,eax
  488.   mov eax,8
  489.   mul ebx
  490.   mov ebx,eax
  491.   dec esi
  492.   cmp esi,edi
  493.   jnz @b
  494. done:
  495.   mov [esp+7*4],ecx  ;save EAX for ret
  496.   popad
  497.   ret
  498. str2numo endp
  499.  
  500. strchr proc uses edi ecx,s1:dword,c1:byte
  501.   mov edi,s1
  502.   callp strlen,edi
  503.   mov ecx,eax
  504.   mov al,c1
  505.   repnz scasb
  506.   .if zero?
  507.     dec edi    ;go back to c1
  508.     mov eax,edi
  509.     ret
  510.   .endif
  511.   xor eax,eax  ;else ret NULL
  512.   ret
  513. strchr endp
  514.  
  515. strcspn proc,s1:dword,s2:dword
  516.   local pos:dword
  517.   pushad
  518.   mov edx,s2
  519.   mov edi,edx
  520.   mov esi,s1
  521.   callp strlen,edi
  522.   mov ebx,eax
  523.   inc ebx  ;must count NULL too
  524.   mov pos,0
  525. @@:
  526.   mov ecx,ebx
  527.   lodsb
  528.   repnz scasb
  529.   .if zero?
  530.     popad
  531.     mov eax,pos
  532.     ret
  533.   .endif
  534.   inc pos
  535.   mov edi,edx
  536.   jmp @b
  537. strcspn endp
  538.  
  539. strspn proc,s1:dword,s2:dword
  540.   local pos:dword
  541.   pushad
  542.   mov edx,s2
  543.   mov edi,edx
  544.   mov esi,s1
  545.   callp strlen,edi
  546.   mov ebx,eax
  547.   inc ebx  ;must count NULL too
  548.   mov pos,0
  549. @@:
  550.   mov ecx,ebx
  551.   lodsb
  552.   repnz scasb
  553.   .if !zero?
  554.     popad
  555.     mov eax,pos
  556.     ret
  557.   .endif
  558.   inc pos
  559.   mov edi,edx
  560.   jmp @b
  561. strspn endp
  562.  
  563. strdup proc,s1:dword
  564.   callp strlen,s1
  565.   inc eax  ;for NULL
  566.   callp malloc,eax
  567.   .if eax==NULL
  568.     ret
  569.   .endif
  570.   callp strcpy,eax,s1    ;will return eax
  571.   ret
  572. strdup endp
  573.  
  574. strlwr proc uses esi edi ecx,s1:dword
  575.   callp strlen,s1
  576.   mov esi,s1
  577.   mov edi,esi
  578.   mov ecx,eax
  579. @@:
  580.   lodsb
  581.   .if (al>='A') && (al<='Z')
  582.     add al,'a'-'A'  ;lower it
  583.     mov [edi],al
  584.   .endif
  585.   inc edi
  586.   dec ecx
  587.   jnz @b
  588.   mov eax,s1
  589.   ret
  590. strlwr endp
  591.  
  592. strupr proc uses esi edi ecx,s1:dword
  593.   callp strlen,s1
  594.   mov esi,s1
  595.   mov edi,esi
  596.   mov ecx,eax
  597. @@:
  598.   lodsb
  599.   .if (al>='a') && (al<='z')
  600.     add al,'A'-'a'  ;capitilize
  601.     mov [edi],al
  602.   .endif
  603.   inc edi
  604.   dec ecx
  605.   jnz @b
  606.   mov eax,s1
  607.   ret
  608. strupr endp
  609.  
  610. strpbrk proc,s1:dword,s2:dword
  611.   local pos:dword
  612.   pushad
  613.   mov edi,s2
  614.   mov esi,s1
  615.   callp strlen,edi
  616.   mov ebx,eax
  617.   callp strlen,esi
  618.   mov edx,eax
  619. ;  inc ebx  ;DO NOT count NULL
  620.   mov pos,0
  621. @@:
  622.   mov ecx,ebx
  623.   lodsb
  624.   repnz scasb
  625.   .if zero?
  626.     popad
  627.     mov eax,pos
  628.     add eax,s1
  629.     ret
  630.   .endif
  631.   inc pos
  632.   mov edi,s2
  633.   dec edx
  634.   jnz @b
  635.   popad
  636.   xor eax,eax
  637.   ret
  638. strpbrk endp
  639.  
  640. strrchr proc uses edi ecx,s1:dword,c1:byte
  641.   mov edi,s1
  642.   callp strlen,edi
  643.   mov ecx,eax
  644.   mov al,c1
  645.   std
  646.   repnz scasb
  647.   .if zero?
  648.     inc edi    ;go back to c1
  649.     mov eax,edi
  650.     ret
  651.   .endif
  652.   cld
  653.   xor eax,eax  ;else ret NULL
  654.   ret
  655. strrchr endp
  656.  
  657. strrev proc,s1:dword
  658.   pushad
  659.   mov esi,s1
  660.   callp strlen,esi
  661.   .if !eax
  662.     popad
  663.     ret
  664.   .endif
  665.   mov edi,s1
  666.   add edi,eax
  667.   mov ecx,eax
  668.   shr ecx,1
  669. @@:
  670.   mov al,[esi]
  671.   mov ah,[edi]
  672.   mov [esi],ah
  673.   mov [edi],al
  674.   inc esi
  675.   dec edi
  676.   dec ecx
  677.   jnz @b
  678.   popad
  679.   mov eax,s1
  680.   ret
  681. strrev endp
  682.  
  683. strset proc uses edi ecx,s1:dword,c1:byte
  684.   mov edi,s1
  685.   callp strlen,edi
  686.   mov ecx,eax
  687.   mov al,c1
  688.   rep stosb
  689.   mov eax,s1
  690.   ret
  691. strset endp
  692.  
  693. strstr proc,s1:dword,s2:dword
  694.   pushad
  695.   mov esi,s1
  696.   callp strlen,esi
  697.   mov ecx,eax
  698.   callp strlen,s2
  699.   mov edx,eax
  700. @@:
  701.   callp memcmp,esi,s2,edx
  702.   .if !eax
  703.     mov [esp+7*4],esi
  704.     popad
  705.     ret
  706.   .endif
  707.   inc esi
  708.   dec ecx
  709.   jnz @b
  710.   popad
  711.   xor eax,eax
  712.   ret
  713. strstr endp
  714.  
  715. strtok proc,s1:dword,s2:dword
  716.   pushad
  717.   mov edi,s1
  718.   cmp edi,NULL
  719.   jz get_next_tok
  720. ;find 1st token
  721.   callp strlen,s1
  722.   add eax,s1
  723.   mov tokend,eax
  724.   call find_tok
  725.   mov [esp+7*4],eax
  726.   popad
  727.   ret
  728. get_next_tok:
  729.   mov edi,tok
  730.   .if !edi
  731.     popad
  732.     xor eax,eax
  733.     ret
  734.   .endif
  735.   call find_tok
  736.   mov [esp+7*4],eax
  737.   popad
  738.   ret
  739.  
  740. find_tok:
  741.   ;edi=string (s1)
  742.   mov esi,s2
  743.   .if !esi    ;s2 should not be NULL
  744.     xor eax,eax
  745.     db 0c3h  ;ret
  746.   .endif
  747.   .if edi > tokend
  748.     xor eax,eax
  749.     mov tok,eax
  750.     db 0c3h  ;ret
  751.   .endif
  752.   callp strlen,esi
  753.   mov ebx,eax
  754.   mov edx,edi
  755. @@:
  756.   callp memcmp,edi,esi,ebx
  757.   .if !eax
  758.     mov ecx,ebx
  759.     mov al,0
  760.     rep stosb
  761.     mov tok,edi  ;tok=next tok area for next time
  762.   .else
  763.     inc edi
  764.     jmp @b
  765.   .endif
  766. @@:
  767. ;ret edi
  768.   mov edi,edx
  769. @@:
  770.   .if ! bptr[edi]
  771.     ;gotta move to next thing
  772.     inc edi
  773.     .if edi>tokend
  774.       xor eax,eax
  775.       mov tok,eax
  776.       db 0c3h  ;ret
  777.     .endif
  778.     jmp @b
  779.   .endif
  780.   mov eax,edi
  781.   db 0c3h  ;ret
  782. strtok endp
  783.  
  784. ;have no idea what this is for
  785. ;BC help was nohelp in explaining what it even does
  786. ;got this from BCv5.0 LIB hacks
  787.  
  788. strxfrm proc,dest:dword,src:dword,len:dword
  789.   callp strlen,src
  790.   .if eax>=len
  791.     ret    ;return EAX as is
  792.   .endif
  793.   push eax
  794.   inc eax
  795.   callp memcpy,dest,src,eax
  796.   pop eax
  797.   ret
  798. strxfrm endp
  799.  
  800. stricmp proc,s1:dword,s2:dword
  801.   pushad
  802.   mov esi,s1
  803.   mov edi,s2
  804. @@:
  805.   lodsb
  806.   .if (al>='a') && (al<='z')
  807.     add al,'A'-'a'
  808.   .endif
  809.   mov bl,al
  810.   mov al,[edi]
  811.   inc edi
  812.   .if (al>='a') && (al<='z')
  813.     add al,'A'-'a'
  814.   .endif
  815.   cmp bl,al
  816.   ja above
  817.   jb below
  818.   cmp byte ptr[esi-1],0
  819.   jnz @b
  820.   popad
  821.   xor eax,eax
  822.   ret
  823. above:
  824.   popad
  825.   mov eax,1   ;p1 > p2
  826.   ret
  827. below:
  828.   popad
  829.   or eax,-1    ;p1 < p2
  830.   ret
  831. stricmp endp
  832.  
  833. gets proc,str1:dword  ;ADDED : v2.01
  834.   pushad              ;FIX : v2.04 Beta #2 
  835. @@top:
  836.   mov edi,str1        ; this was using old key codes
  837. @@:                   ; and so was scanf()
  838.   callp _getch
  839.   .if al==KB_ESC   ;ignore this line
  840.     callp putch,'\'
  841.     callp putch,13
  842.     callp putch,10
  843.     jmp @@top
  844.   .endif
  845.   .if al==KB_ENTER
  846.     mov al,0
  847.     stosb
  848.     callp putch,10  ;print a \n
  849.     callp putch,13  
  850.     popad
  851.     mov eax,str1
  852.     ret
  853.   .endif
  854.   .if ((al==KB_BS) || (ax==KB_LEFT)) && (edi!=str1)
  855.     callp putch,8
  856.     callp putch,' '
  857.     callp putch,8
  858.     dec edi
  859.     jmp @b
  860.   .endif 
  861.   .if (al<32)  ;don't allow certain codes
  862.     jmp @b
  863.   .endif
  864.   stosb
  865.   callp putch,al
  866.   jmp @b
  867. gets endp
  868.  
  869. puts proc,str1:dword  ;ADDED : v2.01
  870.   callp print,str1
  871.   callp putch,10
  872.   callp putch,13
  873.   xor eax,eax
  874.   ret
  875. puts endp
  876.  
  877. end
  878.